package logica_de_presentacion;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashSet;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import comun.Capitulo;
import logica_de_negocio.ExcepDeleteOnCascade;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.gestorCapitulo;

public class FormularioBorrarCapitulo extends JInternalFrame implements // MIRAR
		ActionListener {

	private static final long serialVersionUID = 1L;
	protected JButton jbEliminar, jbDetalles, jbSalir;
	private int id_s;
	private JTable tablaDatos;
	private JPanel jpBotones;
	private JScrollPane scrollPane;
	private HashSet<Capitulo> lc;

	public FormularioBorrarCapitulo(int id_s) {

		super("Borrar Capitulo", true, true, true, true);
		this.setVisible(true);
		this.id_s = id_s;
		this.setSize(500, 500);
		this.subCompo();
	}

	public void subCompo() {

		this.getContentPane().setLayout(new BorderLayout());
		// TABLA
		// CREAMOS UN SCROLLPANE Y LE ANADIMOS LA TABLA
		scrollPane = new JScrollPane(tablaDatos);
		// ANADIMOS EL SCROLLPANE AL PANEL
		this.add(scrollPane, "Center");
		jpBotones = new JPanel(new FlowLayout());
		jbDetalles = new JButton("Ver detalles");
		jbDetalles.addActionListener(this);
		jbDetalles.setMnemonic(KeyEvent.VK_V);
		jbDetalles
				.setToolTipText("Muestra mas detalles del capitulo selecionada");
		jpBotones.add(jbDetalles);

		jbEliminar = new JButton("Eliminar");
		jbEliminar.addActionListener(this);
		jbEliminar.setMnemonic(KeyEvent.VK_E);
		jbEliminar.setToolTipText("Eliminar capitulo de la base de datos");
		jpBotones.add(jbEliminar);

		jbSalir = new JButton("Salir");
		jbSalir.addActionListener(this);
		jbSalir.setMnemonic(KeyEvent.VK_S);
		jbSalir.setToolTipText("Salir  de la tabla");
		jpBotones.add(jbSalir);

		this.getContentPane().add(jpBotones, "South");
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsado = (JButton) e.getSource();
		gestorCapitulo gc = new gestorCapitulo();
		if (botonPulsado == jbDetalles) {
			try {
				String nombre = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);
				int num_cap = (int) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 2);
				try {
					Capitulo cap = gc.getCapitulo(id_s, nombre, num_cap);
					JOptionPane.showMessageDialog(new Frame(), cap.toString());
				} catch (FaltanDatosEnLaBaseDeDatos e1) {
					JOptionPane.showMessageDialog(new Frame(), e1.getFalta());
				} catch (ClassNotFoundException e1) {
					JOptionPane.showMessageDialog(new Frame(),
							"No hay informacion en la base de datos");
					this.dispose();
				}
			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			}
		}

		if (botonPulsado == jbEliminar) {
			try {
				String nombre = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);
				int num_cap = (int) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 2);
				try {
					Capitulo cap = gc.getCapitulo(id_s, nombre, num_cap);
					eliminarCapitulo(cap.getId_c());
				} catch (FaltanDatosEnLaBaseDeDatos e1) {
					JOptionPane.showMessageDialog(new Frame(), e1.getFalta());
				} catch (ClassNotFoundException e1) {
					JOptionPane.showMessageDialog(new Frame(),
							"No hay informacion en la base de datos");
					this.dispose();
				}
			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			}
		}

		if (botonPulsado == jbSalir) {
			this.dispose();
		}
	}

	private void eliminarCapitulo(int id_c) throws ClassNotFoundException {
		gestorCapitulo gc = new gestorCapitulo();
		boolean corec = false;
		try {
			corec = gc.borrar(id_c, new ExcepDeleteOnCascade());
		} catch (ExcepDeleteOnCascade e) {
			int res = JOptionPane
					.showConfirmDialog(
							new Frame(),
							"Al eliminar el capitulo tambien se eliminaran los comentarios de los usuarios y estos dejaran de seguir el capitulo");
			// YES=0, NO=1,Cancel =2
			if (res == 0) {
				e.setAceptado(true);
				try {
					corec = gc.borrar(id_c, e);
				} catch (ExcepDeleteOnCascade e1) {
				}
			}
		}
		if (corec == true) {
			JOptionPane.showMessageDialog(new Frame(),
					"Se ha borrado correctamente el capitulo");
			this.refreshTable();
		} else {
			JOptionPane.showMessageDialog(new Frame(),
					"No se ha borrado el capitulo");
		}
	}

	public void cargarCapitulo() throws ClassNotFoundException {// DAMOS LOS
																// CAPITULOS
																// GUARDADOS
		gestorCapitulo gc = new gestorCapitulo();
		lc = gc.getCapitulos();
		crearTabla();

		this.setVisible(true);
		subCompo();
	}

	public void crearTabla() throws ClassNotFoundException {

		tablaDatos = null;// VACIAMOS SI EXISTE ALUGUNA
		myTable tmp = new myTable();
		tablaDatos = new JTable(tmp);

		tablaDatos.setPreferredScrollableViewportSize(new Dimension(200, 200));
		tablaDatos.setEnabled(true);

		// QUE PODAMOS SELECIONAR LAS FILAS
		tablaDatos.setRowSelectionAllowed(true);

		// QUE SE ACTUALICE (La tabla que contiene)
		tmp.fireTableDataChanged();

		// SI QUEREMOS QUE LA TABLA LLENE POR COMPLETO LA VENTANA EN LA ALTURA
		tablaDatos.setFillsViewportHeight(false);

		// CREAR UNA ORDENACION AUTOMATICA
		tablaDatos.setAutoCreateRowSorter(true);

	}

	private void refreshTable() throws ClassNotFoundException {
		gestorCapitulo gc = new gestorCapitulo();
		lc = gc.getCapitulos();
		myTable tpm = (myTable) tablaDatos.getModel();
		tpm.setData();
		tpm.fireTableDataChanged();
	}

	/** Returns an ImageIcon, or null if the path was invalid. */
	protected static ImageIcon createImageIcon(String path) // ICONO
	{
		java.net.URL imgURL = Button.class.getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}

	class myTable extends AbstractTableModel {

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private String[] columName = { "Nombre", "N Temp.", "N Capitulo",
				"Fecha de Emision" };
		private Object[][] data;

		public myTable() throws ClassNotFoundException {

			super();
			setData();
		}

		@Override
		public int getColumnCount() {
			return columName.length;
		}

		@Override
		public int getRowCount() {
			return data.length;
		}

		@Override
		public String getColumnName(int col) {
			return columName[col];
		}

		@Override
		public Object getValueAt(int row, int col) {

			return data[row][col];
		}

		public int NunCapSerie() throws ClassNotFoundException {
			int i = 0;
			gestorCapitulo gc = new gestorCapitulo();
			lc = gc.getCapitulos();
			for (Capitulo c : lc) {
				if (c.getId_s() == id_s) {
					i++;
				}
			}
			return i;
		}

		public void setData() throws ClassNotFoundException {

			int cont = 0;
			data = null;
			data = new Object[NunCapSerie()][];

			// RELLENO DATOS
			for (Capitulo c : lc) {
				if (c.getId_s() == id_s) {
					Object[] a = { c.getNombre(), c.getNum_temp(),
							c.getNum_cap(), c.getFecha_emi() };
					data[cont] = a;
					cont++;
				}
			}
		}
	}
}
